public class Test {
    public static void main(String[] args) {
        
    }
    public static void main4(String[] args) {
        //异常的声明
        //异常声明throws
        //1. throws必须跟在方法的参数列表之后
        //2. 声明的异常必须是 Exception 或者 Exception 的子类
        //3. 方法内部如果抛出了多个异常，throws之后必须跟多个异常类型，之间用逗号隔开，
        //如果抛出多个异常类型具有父子关系，直接声明父类即可。
        //4. 调用声明抛出异常的方法时，调用者必须对该异常进行处理，或者继续使用throws抛出
        // try-catch捕获并处理
        //语法格式：
        //try{
        //// 将可能出现异常的代码放在这里
        //}catch(要捕获的异常类型 e){
        //// 如果try中的代码抛出异常了，此处catch捕获时异常类型与try中抛出的异常类型一致时，或者是try中抛出异常的基类
        //时，就会被捕获到
        //// 对异常就可以正常处理，处理完成后，跳出try-catch结构，继续执行后序代码
        //}[catch(异常类型 e){
        //// 对异常进行处理
        //}finally{
        //// 此处代码一定会被执行到
        //}]
        //// 后序代码
        //// 当异常被捕获到时，异常就被处理了，这里的后序代码一定会执行
        //// 如果捕获了，由于捕获时类型不对，那就没有捕获到，这里的代码就不会被执行
        //注意：
        //1. []中表示可选项，可以添加，也可以不用添加
        //2. try中的代码可能会抛出异常，也可能不会
        //1. try块内抛出异常位置之后的代码将不会被执行
        //2. 如果抛出异常类型与catch时异常类型不匹配，即异常不会被成功捕获，也就不会被处理，继续往外抛，直到
        //JVM收到后中断程序----异常是按照类型来捕获的
        //3. try中可能会抛出多个不同的异常对象，则必须用多个
    }
    public static void main3(String[] args) {
        //异常的抛出
        //1. throw必须写在方法体内部
        //2. 抛出的对象必须是Exception 或者 Exception 的子类对象
        //3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类，则可以不用处理，直接交给JVM来处理
        //4. 如果抛出的是编译时异常，用户必须处理，否则无法通过编译
        //5. 异常一旦抛出，其后的代码就不会执行
    }
    public static void main2(String[] args) {
        //异常
        //异常的体系结构
        //1. Throwable：是异常体系的顶层类，其派生出两个重要的子类, Error 和 Exception
        //2. Error：指的是Java虚拟机无法解决的严重问题，比如：JVM的内部错误、资源耗尽等，典型代表：
        //StackOverflowError和OutOfMemoryError，一旦发生回力乏术。
        //3. Exception：异常产生后程序员可以通过代码进行处理，使程序继续执行。比如：感冒、发烧。我们平时所说的异常就是Exception
        //异常分类
        //1. 编译时异常:在程序编译期间发生的异常，称为编译时异常，也称为受检查异常(Checked Exception)
        //2.运行时异常在程序执行期间发生的异常，称为运行时异常，也称为非受检查异常(Unchecked Exception)
        //异常的处理：第一次牵手
        //1.事前防御型：询问牵手 被打 缺陷：正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱
        //2.事后认错型：先牵手 然后被打 优势：正常流程和错误流程是分离开的, 程序员更关注正常流程，代码更清晰，容易理解代码
        //异常的5个关键字 try throw catch finally throws
    }
    public static void main1(String[] args) {
        //StringBuffer 多线程下必须先完成当前执行的事才能进行下一件事 比如上厕所and上厕所排队
        //所以相较于StringBuilder StringBuffer执行大量相同操作时 会慢一些
        //在本身上改变 不会创建新的对象
        StringBuffer stringBuffer = new StringBuffer("qin bo ");
        stringBuffer.append(123);
        stringBuffer.append("is da s bi");
        System.out.println(stringBuffer);
        //StringBuilder 返回this不产生其他对象
        StringBuilder stringBuilder = new StringBuilder("qin bo");
        stringBuilder.append("毕业年薪会达到20万！！！！");
        System.out.println(stringBuilder);
        System.out.println("尽管可能会使你很疲惫 但是请你永远相信自己 你可以的 加油！！！");
        //1. String、StringBuffer、StringBuilder的区别
        //String的内容不可修改，StringBuffer与StringBuilder的内容可以修改.
        //StringBuffer与StringBuilder大部分功能是相似的
        //StringBuffer采用同步处理，属于线程安全操作；而StringBuilder未采用同步处理，属于线程不安全操作
    }
}
